package org.example.boot.usercenter.utils;

import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import javax.servlet.http.HttpServletRequest;
import java.security.Key;
import java.util.Date;


/**
 * @InterfaceName: JwtUtil
 * @Description:
 * @Author: YourName
 * @Date: 2025/2/24
 */
public class JwtUtils {
    private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); //会生成一个随机的密钥，用于签名 JWT。这个密钥在生成和验证过程中都需要保持一致。

    private static final long EXPIRATION_TIME = 86400000; // 24h（单位：毫秒）

    // 生成 Token 时使用 openid 作为标识
    public static String generateToken(String openid) {
        return Jwts.builder()
                .setSubject(openid) // 使用 openid 作为主体
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SECRET_KEY)
                .compact();
    }

    // 解析JWT
    public static String getTokenOpenid(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY)
                .build() //这是 JWT 解析的基本步骤，首先使用签名密钥 SECRET_KEY 来验证 token 的合法性
                .parseClaimsJws(token)//解析传入的 JWT 字符串，返回解析后的 Claims 对象。
                .getBody()
                .getSubject();// 从 Claims 中获取存储的 "subject"（即用户名），并将其作为结果返回
    }

    // 验证JWT有效性
    public static boolean validateToken(String token) {
        try {
            Jwts.parserBuilder()
                    .setSigningKey(SECRET_KEY)
                    .build()
                    .parseClaimsJws(token);
            return true;
        } catch (JwtException | IllegalArgumentException e) {
            throw e; // 抛出异常，由过滤器处理
        }
    }
    // 提取 Token 方法
    public static String extractToken(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }
}
